package com.qf.blog.system.service.impl;

import com.alibaba.fastjson.JSON;
import com.qf.blog.core.utils.UUIDUtils;
import com.qf.blog.system.constants.RedisKey;
import com.qf.blog.system.dto.UserToken;
import com.qf.blog.system.entity.SystemUserEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.Date;
import java.util.concurrent.TimeUnit;

@Service
public class TokenService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private Long defaultTimeOut = 30 * 60 * 1000L; // 默认超时时间是30分钟

    public UserToken createToken(SystemUserEntity systemUserEntity) {

        // 1.把用户的登录信息全部封装到userToken对象中
        UserToken userToken = new UserToken();
        Date createTime = new Date();
        userToken.setCreateTime(createTime); // 登录时间
        long timeout = createTime.getTime() + defaultTimeOut; // 超时时间=登录时间+30分钟
        userToken.setTimeout(new Date(timeout)); // 把Long类型转成Date类型

        userToken.setUserId(systemUserEntity.getId());
        userToken.setUsername(systemUserEntity.getUsername());
        userToken.setToken(UUIDUtils.getId()); // 登录用户的令牌，需要返回给前端

        // 以用户的token(令牌）作为key的唯一标识
        String key = String.format(RedisKey.USER_LOGIN_KEY, userToken.getToken());

        // 把用户的登录信息保存到redis中，过期时间是30m，
        stringRedisTemplate.opsForValue().set(key, JSON.toJSONString(userToken), 30, TimeUnit.MINUTES);

        return userToken;
    }

    public UserToken getToken(String token) {
        String key = String.format(RedisKey.USER_LOGIN_KEY, token);
        String json = stringRedisTemplate.opsForValue().get(key);
        if (ObjectUtils.isEmpty(json)) {
            return null;
        }
        return JSON.parseObject(json, UserToken.class);
    }
}
